import matplotlib
import numpy as np
import matplotlib.pyplot as plt

# -------------------------------------------------
# 1. 参数
T = 0.5                                 # 采样周期
                   # 采样点编号 0~4
x_n = np.array([7, 6, 7, -1, 7])       # 对应的幅值
n = np.arange(0, len(x_n))
# 2. sinc 插值函数（归一化 sinc）
def sinc_interp(t):
    """在任意实数 t 处返回 sinc 插值结果"""
    # 计算每个基函数的贡献并求和
    # np.sinc 的定义为 sin(pi*x)/(pi*x)，恰好是归一化 sinc
    # 这里的自变量是 (t - n*T)/T
    return np.sum(x_n[:, None] *
                  np.sinc((t[None, :] - n[:, None] * T) / T), axis=0)

if __name__ == "__main__":
    # 3. 生成绘图用的时间轴
    t_fine = np.linspace(0, 12, 2000)   # 细密采样，覆盖几个周期

    # 4. 计算插值曲线
    x_fine = sinc_interp(t_fine)
    matplotlib.rcParams['font.family'] = 'Microsoft YaHei'  # Windows 常用

    # 5. 绘图
    plt.figure(figsize=(8, 4))
    # 连续插值曲线
    plt.plot(t_fine, x_fine, label='Sinc 插值', color='steelblue')
    # 采样点（用实心圆标记）
    plt.scatter([i * T for i in n], x_n, color="steelblue", s=60, edgecolor="k", alpha=0.8)
    # 美化
    plt.title(f'Sinc 插值重建（周期 $T={T}$）')
    plt.xlabel('时间 $t$')
    plt.ylabel('幅值')
    plt.grid(True, which='both', ls='--', alpha=0.5)
    plt.legend()
    plt.tight_layout()
    plt.gca().set_aspect('equal', adjustable='box')
    plt.show()
